home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-Sensation: Demos Are Forever
/
Amiga CD-Sensation - Ausgabe 1 - Demos Are Forever (1996)(GTI - Schatztruhe)(DE)[!].iso
/
Big Bunch
/
The Rest
/
Starfields
/
ES.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-17
|
39KB
|
1,524 lines
*\ :ts=8 bk=0
*
* ES.asm: A neato star program based on some Euro code (from the group
* "Absence" I believe).
*
* This code came from Portal under the name STARTOY.LZH and
* was uploaded by Greg Cunningham (author of BaudBandit).
* The program was disassembled using ReSource 4.16 (from The
* Puzzle Factory), and modified from there by me.
*
* Improvements:
* o No longer Disable()s the world whle running.
* o Tossed out hard-coded custom copper list; now uses an
* Intuition screen. (Drag it! Amaze your friends!)
* o Uses Intuition Window to collect mouse click.
* o Now *closes* GfxBase.
* o Clipping improved.
* o Replaced 800-entry sinetable with 1024-entry table.
* o Angles and spins now forced to even values.
* o New, more traditional perspective formula.
* o Reasonably commented.
* o Busy-wait for bottom-of-frame replaced with copper
* interrupt.
* o New amazing stupendous incredible argument parser.
* o Code speed improved slightly (!)
* o Has an ARexx port!!!!!
*
* Some dedicated EuroHacker 91??.??
* Leo L. Schwab (415) 903-9321 9109.12
* New argument parsing 9205.09
* New 1024-entry sinetable 9205.09
* Functional ARexx 9205.10
* BOF copper interrupt 9205.11
*/
****************************************************************************
* Documentation.
*
******* ES ******************************************
*
* NAME
* ES -- EuroStars
*
* SYNOPSIS
* ES [MRS][XYZ] <value> [<value> ... ]
* ES B
* ES Q (ARexx only)
*
* DESCRIPTION
* ES is a starfield program based on European code that has been
* massively cleaned up and featurized. As a result, it doesn't run
* quite as smoothly on vanilla 68000-based systems, but it's less
* likely to trash your system.
*
* ES may be run from the command line or from the Workbench. When
* you're finished looking, click the left mouse button anywhere on the
* starfield to exit.
*
* ES lets you specify how the stars move and rotate. This is done
* from the command line or from the ARexx port. For both, the
* argument syntax is the same.
*
* ARGUMENTS
* The M, R, and S operators specify star movement, rotation, and spin
* respectively. Movement specifies how many world units the stars are
* translated each frame. Rotation specifies a static/initial rotation
* angle. Spin specifies the change in rotation for each frame. The
* X, Y, and Z specifiers indicate which axes the operators are to
* apply. Rotation angles are specified in "EuroHackerGrads." There
* are 2048 EHG to a full 360 degree circle.
*
* The MRS operators must appear before the the XYZ specifiers, and
* there may be no spaces between them. Only one MRS operator may
* appear before a given set of XYZ specifiers. Following the MRSXYZ
* command are the actual values to be used.
*
* It's much easier to understand if you look at the examples.
*
* In addition to the above, there are two additional arguments that
* may be used:
*
* B: Operate as background server.
* Ordinarily, ES will exit when you click on its screen.
* However, if you want to do extensive ARexx operations
* without user interference, this option may be specified,
* causing ES to ignore all subsequent mouse events on its
* screen. Once backgrounded, ES cannot be un-backgrounded.
* The only way to terminate a backgrounded ES is with the
* following command:
*
* Q: Quit.
* When sent as an ARexx command, ES will exit immediately.
* This option on the CLI command line is meaningless; if
* present, the entire command line is ignored.
*
* AREXX
* ES features an ARexx port. The name of the port is EUROSTARS.
* Commands sent to this port are exactly the same as those on the
* command line. Malformed commands are returned with RC set to
* RC_ERROR (10).
*
* Commands are cumulative; that is, a move command (for example)
* remains in effect until reset by another move command for the same
* axis. Thus, an MX command followed later by an SX command does not
* cancel the MX command.
*
* EXAMPLES
* ES mx 4
* Move stars 4 units along X axis each frame.
* ES sxyz 2 -4 6
* For each frame, spin the X axis 2 EHG, the Y axis -4 EHG,
* and the Z axis 6 EHG.
* ES rx 512
* Rotate X axis 512 EHG and keep it there.
* ES rx -512 sx 2
* Start X axis rotated at -512 EHG and add 2 EHG to it each
* frame.
* ES mxz 10 0 sxyz 2 2 2
* Move 10 units along X, zero units along Z, and spin all axes
* by two EHG each frame.
* ES mxz sxyz 10 0 2 2 2
* Identical to the above.
* ES sxmxsymzsz 2 10 2 0 2
* Again, identical to the above.
*
* As you can see, the syntax is very flexible.
*
* NOTES
* Despite its nomenclature, the 'B' option does not fork ES into the
* background; you must use the 'Run' command.
*
* The coordinate system is right-handed, X axis horizontal, Y axis
* vertical, Z axis perpendicular to the screen. Positive rotations
* are clockwise, and are in Z,Y,X order.
*
* The default startup values are:
* MX 0 MY 0 MZ 4 RX 0 RY 0 RZ 0 SX 0 SY 0 SZ 0
*
* BUGS
* Slow on a 68000. Short of Disable()ing the system or reducing the
* number of stars, this is unavoidable.
*
* Malformed commands generate a diagnostic string to the CLI. These
* strings are not available to ARexx programs. Sigh...
*
* AUTHOR
* Leo L. Schwab -- New Technologies Group, Inc.
* BIX: ewhac
* Portal: ewhac
* InterNet: ewhac@ntg.com ..or.. ewhac@well.sf.ca.us
*
****************************************************************************
* Includes.
*
include 'exec/types.i'
include 'exec/memory.i'
include 'graphics/gfxbase.i'
include 'hardware/intbits.i'
include 'intuition/intuition.i'
include 'libraries/dosextens.i'
include 'rexx/storage.i'
include 'rexx/errors.i'
****************************************************************************
* A couple of simple macros.
*
xlib MACRO
XREF _LVO\1
ENDM
jsrlib MACRO
jsr _LVO\1(a6)
ENDM
****************************************************************************
* External references.
*
xlib AllocMem
xlib FreeMem
xlib AllocSignal
xlib FreeSignal
xlib AddIntServer
xlib RemIntServer
xlib OpenLibrary
xlib CloseLibrary
xlib Forbid
xlib Permit
xlib WaitPort
xlib PutMsg
xlib GetMsg
xlib ReplyMsg
xlib AddPort
xlib RemPort
xlib FindTask
xlib Signal
xlib Wait
xlib OpenScreen
xlib OpenWindow
xlib CloseScreen
xlib CloseWindow
xlib SetPointer
xlib MakeScreen
xlib GetScreenData
xlib RethinkDisplay
xlib QueryOverscan
xlib LoadRGB4
xlib FreeCopList
xlib UCopperListInit
xlib CWait
xlib CMove
xlib CBump
xlib Output
xlib Write
xlib CreateProc
xlib Lock
xref _intreq
****************************************************************************
* Public symbols (primarily for debugging).
*
xdef Transform
xdef NextStar
xdef StarSeg
xdef MoveStars
xdef DrawStars
xdef SinCos
xdef ParseArgs
****************************************************************************
* Symbol Definitions
*
MINBOX equ -450
MAXBOX equ 450
BOXRANGE equ MAXBOX-MINBOX+1
MAGIC equ $10000 ; 256 << 8
ZPULL equ 780
SCRWIDE equ 352
SCRHIGH equ 230
SPRBUFSIZ equ 12
****************************************************************************
* And now for the code!
*
section EuroStars,code
CreatedSix
;------ Test CLI vs. Workbench
bsr ClearBSS ; Initialize uninitialized data
moveq #0,d7 ; No error
move.l a0,a2 ; Save CLI command line data
move.l d0,d2
move.l (4).w,a6
sub.l a1,a1 ; Find ourselves
jsrlib FindTask
move.l d0,mpsigtask
move.l d0,a0
tst.l pr_CLI(a0) ; Are we a CLI?
beq.s WBench ; No, don't parse command line.
;------ CLI startup. Parse arguments.
move.l a2,a0 ; Restore CLI command data
move.l d2,d0
clr.b 0(a0,d0.l) ; Force NULL at end of command line
bsr ParseArgs
move.l d0,d7 ; Save error string (it's easier
bra.s OpenDOS ; this way. Trust me.)
;------ Workbench startup. Get startup message.
WBench lea pr_MsgPort(a0),a2
move.l a2,a0
jsrlib WaitPort
move.l a2,a0
jsrlib GetMsg
move.l d0,WBStartMsg
;------ Open DOS.
OpenDOS move.l (4).w,a6
lea DOSName(pc),a1
moveq #0,d0
jsrlib OpenLibrary
move.l d0,DOSBase
beq err_dos
;------ Now then, did the parser return an error?
move.l d7,d0
ble.s 1$ ; (Ignore 'QUIT')
bsr PrintCLIStr ; Print the error
bra err_mem ; Exit (closing DOS)
1$
;------ Allocate memory for blank sprite.
moveq #SPRBUFSIZ,d0
move.l #MEMF_CHIP!MEMF_CLEAR,d1
jsrlib AllocMem
move.l d0,sprdat
beq err_mem
;------ Allocate signal for message port.
moveq #-1,d0
jsrlib AllocSignal
move.b d0,mpsigbit
bmi err_signal
;------ Open Graphics
lea GfxName(pc),a1
moveq #0,d0
jsrlib OpenLibrary
move.l d0,GBase
beq err_gfx
;------ Open Intuition
lea IntuiName(pc),a1
moveq #0,d0
jsrlib OpenLibrary
move.l d0,IBase
beq err_intui
;------ Open screen
move.l d0,a6
lea scr_def(pc),a0
jsrlib OpenScreen
move.l d0,scrptr
beq err_scr
move.l d0,a2
;------ Open window on screen
lea windef(pc),a0
jsrlib OpenWindow
move.l d0,winptr
beq err_win
;------ Set invisible pointer.
move.l d0,a0
move.l sprdat(pc),a1
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
jsrlib SetPointer
;------ Set local bitplane pointers.
move.l sc_BitMap+bm_Planes+0(a2),Plane1ptr
move.l sc_BitMap+bm_Planes+4(a2),Plane2ptr
;------ Shove Screen's ViewPort into a nice-ish overscan position.
;------ We have to do this differently based on OS revision.
lea XBuff,a3
cmp.w #37,LIB_VERSION(a6) ; What version?
blt.s OScan1_3
;------ Do 2.0 centering. A3 is used as Rectangle structure pointer.
move.l a3,a1
moveq #OSCAN_TEXT,d0
sub.l a0,a0 ; Zero is LORES_KEY
jsrlib QueryOverscan
move.w #SCRWIDE,d0 ; Compute difference in sizes
sub.w ra_MaxX(a3),d0 ; between standard screen and ours.
add.w ra_MinX(a3),d0
move.w #SCRHIGH,d1 ; SCRHIGH - (MaxY - MinY)
sub.w ra_MaxY(a3),d1
add.w ra_MinY(a3),d1
asr.w #1,d0
asr.w #1,d1
sub.w d0,sc_ViewPort+vp_DxOffset(a2) ; Shift screen
sub.w d1,sc_ViewPort+vp_DyOffset(a2)
bra.s AddBOF
;------ Do 1.3 centering. A3 is used as screen buffer pointer.
OScan1_3 move.l a3,a0 ; Screen buffer
move.l #sc_SIZEOF,d0 ; bufsiz
moveq #WBENCHSCREEN,d1 ; Screen type
sub.l a1,a1 ; NULL
jsrlib GetScreenData ; Tell me about the Workbench screen
move.w #SCRWIDE,d0 ; Skate screen acto WBench size
move.w sc_ViewPort+vp_DWidth(a3),d1
btst.b #7,sc_ViewPort+vp_Modes(a3) ; Check HIRES bit
beq.s 2$ ; HIRES?
asr.w #1,d1 ; Yes, divide width by two
2$
sub.w d1,d0
asr.w #1,d0 ; Divide difference by two
sub.w d0,sc_ViewPort+vp_DxOffset(a2) ; Shift screen
move.w #SCRHIGH,d0
move.w sc_ViewPort+vp_DHeight(a3),d1
btst.b #2,sc_ViewPort+vp_Modes+1(a3) ; Check LACE bit
beq.s 3$ ; LACE?
asr.w #1,d1 ; Yes, divide height by two
3$
sub.w d1,d0
asr.w #1,d0
sub.w d0,sc_ViewPort+vp_DyOffset(a2) ; Shift screen
;------ Add Bottom-of-frame copper interrupt.
AddBOF lea MyCopList,a3
move.l a3,sc_ViewPort+vp_UCopIns(a2) ; vp->UCopIns = cl;
move.l a3,a0 ; CINIT (cl, 4);
moveq #4,d0
move.l GBase(pc),a6
jsrlib UCopperListInit
move.l a3,a1 ; CWAIT (cl, SCRHIGH, 0);
move.l #SCRHIGH,d0
moveq #0,d1
jsrlib CWait
move.l a3,a1
jsrlib CBump
move.l a3,a1 ; CMOVE (cl, intreq,
move.l #_intreq,d0 ; INTF_SETCLR | INTF_COPER);
move.l #INTF_SETCLR!INTF_COPER,d1
jsrlib CMove
move.l a3,a1
jsrlib CBump
move.l a3,a1 ; CEND (cl);
move.l #10000,d0
move.l #255,d1
jsrlib CWait
move.l a3,a1 ; Not sure this is necessary, but the
jsrlib CBump ; gfxmacros.h macro does it...
;------ Recompose display.
move.l a2,a0 ; Screen still in A2
move.l IBase(pc),a6
jsrlib MakeScreen
jsrlib RethinkDisplay
;------ Load colors.
lea sc_ViewPort(a2),a0
lea colors(pc),a1
moveq #4,d0
move.l GBase(pc),a6
jsrlib LoadRGB4
;------ Create sub-process to actually render stars.
move.l mpsigtask(pc),a0
moveq #0,d2
move.b LN_PRI(a0),d2 ; Priority
subq.l #1,d2 ; (Nudge *BELOW* creator)
lea StarSeg(pc),a0
move.l a0,d3 ; SegList pointer
lsr.l #2,d3 ; (Convert to BPTR)
lea ESName(pc),a0
move.l a0,d1 ; Process name
move.l #4096,d4 ; Stack size
move.l DOSBase(pc),a6
jsrlib CreateProc
tst.l d0
beq err_proc
;------ Launch subprocess with startup message.
move.l d0,a0
lea startmsg(pc),a1
move.l (4).w,a6
jsrlib PutMsg
;------ Publish message port.
lea mport(pc),a1
jsrlib AddPort
;------ Wait for ARexx and Intuition events.
bsr HandleEvents
;------ Remove port and flush all pending messages.
jsrlib Forbid ; STOP!
lea mport(pc),a2
move.l a2,a1
jsrlib RemPort ; Pull port from list
moveq #RC_FATAL,d2
flushloop move.l a2,a0
jsrlib GetMsg ; Get message, if any
tst.l d0
beq.s 1$ ; No message, leave loop
move.l d0,a1
move.l d2,rm_Result1(a1) ; Die die die
clr.l rm_Result2(a1)
jsrlib ReplyMsg ; Reply failed message
bra.s flushloop
1$
jsrlib Permit ; Okay, go ahead.
;------ Send kill signal to stars process.
moveq #0,d0
bset #SIGBREAKB_CTRL_C,d0
move.l StarTask(pc),a1 ; RACE!! Might not be set!
jsrlib Signal
;------ Wait for startup message to return.
lea mport(pc),a0
jsrlib WaitPort
;------ Cleanup and exit.
err_proc move.l GBase(pc),a6 ; Delete UCopList by hand
move.l scrptr(pc),a0 ; (required for 1.3)
lea sc_ViewPort+vp_UCopIns(a0),a0
move.l (a0),a1
clr.l (a0) ; Keep system from freeing it, too
move.l ucl_FirstCopList(a1),a0
jsrlib FreeCopList
move.l IBase(pc),a6 ; Close window
move.l winptr(pc),a0
jsrlib CloseWindow
err_win move.l scrptr(pc),a0
jsrlib CloseScreen
err_scr move.l a6,a1
move.l (4).w,a6
jsrlib CloseLibrary ; Close Intuition
err_intui move.l GBase(pc),a1
jsrlib CloseLibrary ; Close Graphics
err_gfx moveq #0,d0
move.b mpsigbit(pc),d0
jsrlib FreeSignal ; Free msgport signal
err_signal move.l sprdat(pc),a1
moveq #SPRBUFSIZ,d0
jsrlib FreeMem
err_mem move.l DOSBase(pc),a1
jsrlib CloseLibrary
err_dos
move.l WBStartMsg(pc),d0 ; Reply Workbench startup
beq.s xit ; if present.
move.l d0,a1
jsrlib ReplyMsg
clr.l d0
xit rts
****************************************************************************
* ARexx message and window event processing loop.
*
HandleEvents
;------ Compute signal flag for window port.
moveq #0,d2
move.l winptr(pc),a0
move.l wd_UserPort(a0),a0
move.b MP_SIGBIT(a0),d0
bset.l d0,d2
;------ Compute signal flag for ARexx port.
move.b mpsigbit(pc),d0
bset.l d0,d2
;------ Wait for something to happen.
eventloop move.l d2,d0
jsrlib Wait
;------ Check for ARexx messages.
moveq #RC_ERROR,d3
0$ lea mport(pc),a0
jsrlib GetMsg
tst.l d0 ; Message present?
beq.s 9$ ; No, fall off
move.l d0,a2
move.l ARG0(a2),a0 ; Get argument string
bsr ParseArgs ; Parse it
move.l d0,d7 ; Was there an error?
ble.s 1$ ; No
move.l d3,rm_Result1(a2) ; Yes, store error
bra.s 2$
1$ clr.l rm_Result1(a2)
2$ clr.l rm_Result2(a2) ; Result2 always NULL
move.l a2,a1
jsrlib ReplyMsg ; Send message back
bra.s 0$ ; Next message, please
9$
;------ Was that parser return a REXX request for death?
tst.l d7
bmi.s Rexxit ; Why, yes it was!
;------ Check for window events.
move.l winptr(pc),a0
move.l wd_UserPort(a0),a0
jsrlib GetMsg ; Check port
tst.l d0 ; Something there?
beq.s eventloop ; No, go to sleep
move.l d0,a1 ; Yup, reply it
jsrlib ReplyMsg
;------ Window event arrived. If we are a background server, ignore
;------ the event. Elsewise, return.
move.w BackServ(pc),d0 ; Just to set flags
bne.s eventloop
Rexxit rts ; User wants us dead, dammit.
****************************************************************************
* Welcome to the actual stars code.
*
cnop 0,4
StarSeg dc.l 0 ; Phony NextSeg pointer
;------ Entry point.
move.l (4).w,a6
sub.l a1,a1
jsrlib FindTask ; Get pointer to this task.
move.l d0,StarTask ; Store
move.l d0,a0
lea pr_MsgPort(a0),a2 ; Get pointer to MsgPort
;------ Wait for startup message.
move.l a2,a0
jsrlib WaitPort
move.l a2,a0
jsrlib GetMsg
move.l d0,StarMsg
;------ Compute sigmask.
moveq #0,d0
bset.l #SIGBREAKB_CTRL_C,d0
bset.l #SIGBREAKB_CTRL_F,d0 ; BOF will happen here.
move.l d0,StarSigMask
;------ Install interrupt server.
moveq #INTB_COPER,d0
lea BOFintrnode(pc),a1
jsrlib AddIntServer
;------ Main star loop.
mainloop bsr AddSpins
bsr Transform
bsr.s MoveStars
move.l StarSigMask(pc),d0
jsrlib Wait ; Wait for BOF or kill signal
move.l d0,StarSigs
bsr EraseStars ; Do this in any case
bsr DrawStars
move.l StarSigs(pc),d0
btst.l #SIGBREAKB_CTRL_C,d0
beq.s mainloop
;------ Got kill signal from above. Remove interrupt server,
;------ reply startup and exit.
jsrlib Forbid ; HA! MINE!
moveq #INTB_COPER,d0
lea BOFintrnode(pc),a1
jsrlib RemIntServer
move.l StarMsg(pc),a1
jmp _LVOReplyMsg(a6) ; Poof! Bye...
****************************************************************************
* Move the stars
*
MoveStars lea XCoords(pc),a0
lea YCoords(pc),a1
lea ZCoords(pc),a2
move.w delta_x(pc),d0
move.w delta_y(pc),d1
move.w delta_z(pc),d2
move.w #BOXRANGE,d4
move.w NumStars(pc),d7
0$ move.w (a0),d3
add.w d0,d3 ; Add move delta
cmp.w #MAXBOX,d3 ; Too big?
bgt.s 1$
cmp.w #MINBOX,d3 ; Too small?
bge.s 2$
add.w d4,d3 ; Wrap up
bra.s 2$
1$ sub.w d4,d3 ; Wrap down
2$ move.w d3,(a0)+
move.w (a1),d3
add.w d1,d3
cmp.w #MAXBOX,d3
bgt.s 11$
cmp.w #MINBOX,d3
bge.s 22$
add.w d4,d3
bra.s 22$
11$ sub.w d4,d3
22$ move.w d3,(a1)+
move.w (a2),d3
add.w d2,d3
cmp.w #MAXBOX,d3
bgt.s 111$
cmp.w #MINBOX,d3
bge.s 222$
add.w d4,d3
bra.s 222$
111$ sub.w d4,d3
222$ move.w d3,(a2)+
dbra d7,0$
rts
****************************************************************************
* Star rendering routines.
*
EraseStars moveq #0,d0
move.l Plane1ptr(pc),a1
move.l Plane2ptr(pc),a2
lea PlaneOffsets,a4
move.w NumStars(pc),d7
1$ move.w (a4)+,d1
move.w d0,0(a1,d1.w) ; Blast entire word.
move.w d0,0(a2,d1.w)
dbra d7,1$
rts
DrawStars lea XBuff,a0
lea YBuff,a1
lea PlaneOffsets,a3
lea ZBuff,a5
move.l Plane1ptr(pc),a2
move.l Plane2ptr(pc),a4
move.w NumStars(pc),d7
move.w #SCRHIGH-1,d4
move.w #SCRWIDE-1,d5
move.w #$8000,d6
NextDraw move.w (a1)+,d0 ; Load and check Y value
bmi.s clipped
cmp.w d4,d0
bgt.s clipped
move.w (a0),d1 ; Load and check X value
bmi.s clipped
cmp.w d5,d1
bgt.s clipped
move.w d1,d2
and.b #15,d1
and.w #$FFF0,d2
lsr.w #3,d2
move.w d6,d3
ror.w d1,d3
mulu #SCRWIDE/8,d0 ; BytesPerRow
add.w d0,d2
move.w d2,(a3)+
cmp.w #-176,(a5) ; Z closer than this?
ble.s 1$ ; No, draw just plane 1 (dim)
or.w d3,0(a4,d2.w) ; This plane definitely gets written
cmp.w #130,(a5) ; Very close?
ble.s 2$ ; No
1$ or.w d3,0(a2,d2.w) ; Yes; draw brightest value
2$ addq.w #2,a5
addq.w #2,a0 ; No, you can't get rid of this easily...
dbra d7,NextDraw
rts
clipped clr.w (a3)+
addq.w #2,a5
addq.w #2,a0
dbra d7,NextDraw
rts
****************************************************************************
* The Biggie!
* Transform all points, rotating about Z, Y, and X axes (in that order).
* Those of you looking for a general matrix multiply here won't find it.
* These are simple two dimensional rotations applied one at a time.
* The sine/cosine table uses 8.8 fixed point notation. The numbers in the
* coordinates array are straight integers.
*
Transform lea CurrentSinCos(pc),a4
move.w theta_x(pc),d0
bsr SinCos
move.w d0,(a4)
move.w d1,2(a4)
move.w theta_y(pc),d0
bsr SinCos
move.w d0,4(a4)
move.w d1,6(a4)
move.w theta_z(pc),d0
bsr SinCos
move.w d0,8(a4)
move.w d1,10(a4)
lea XCoords(pc),a0
lea YCoords(pc),a1
lea ZCoords(pc),a2
lea XBuff,a3
move.w NumStars(pc),d4
move.l #MAGIC,d2 ; 256 as an 8.8 fixed point num.
move.w #ZPULL,d3 ; "Pull out"
;------ Perform rotations.
NextStar move.w (a0),d5 ; X
muls 10(a4),d5 ; * cos(z)
move.w (a1),d1 ; Y
muls 8(a4),d1 ; * sin(z)
sub.l d1,d5 ; == X cos(z) - Y sin(z) == X' D5
lsr.l #8,d5
move.w (a0)+,d6 ; X
muls 8(a4),d6 ; * sin(z)
move.w (a1)+,d1 ; Y
muls 10(a4),d1 ; * cos(z)
add.l d1,d6 ; == X sin(z) + Y cos(z) == Y' D6
lsr.l #8,d6 ; Rotation about Z axis complete.
move.w (a2),d7 ; Z
muls 6(a4),d7 ; * cos(y)
move.w 4(a4),d1 ; sin(y)
muls d5,d1 ; * X'
sub.l d1,d7 ; == Z cos(y) - X' sin(y) == Z' D7
lsr.l #8,d7
move.w (a2)+,d1 ; Z
muls 4(a4),d1 ; * sin(y)
muls 6(a4),d5 ; X' * cos(y)
add.l d1,d5 ; == X' cos(y) + Z sin(y) == X'' D5
lsr.l #8,d5 ; Rotation about Y axis complete.
move.w d6,d0 ; Y'
muls 2(a4),d6 ; * cos(x)
move.w d7,d1 ; Z'
muls (a4),d1 ; * sin(z)
sub.l d1,d6 ; == Y' cos(x) - Z' sin(x) == Y'' D6
lsr.l #8,d6
muls (a4),d0 ; Y' * sin(x)
muls 2(a4),d7 ; Z' * cos(x)
add.l d0,d7 ; == Y' sin(x) + Z' cos(x) == Z'' D7
lsr.l #8,d7 ; Rotation about X axis complete.
* Before I got to this, the perspective formula was:
*
* 1000 - Z
* ----------
* 780 - Z
*
* I ran this through a spreadsheet (Thanks, Mike!) and found that, yes, it
* does yield a hyperbolic curve (which is correct). However, it was so
* alien that I decided to re-work it into a more traditional form found in
* most of my graphics books. The scalar is now:
*
* MAGIC
* -------------
* - (Z - ZPULL)
*
* This is closer to what you'll find in the graphics books. The subtraction
* from Z is to "pull" the stars away from the camera (which is at Z == 0) so
* that they'll be visible. The negation effectively flips the Z axis, which
* makes the calculation easier (trust me). MAGIC and ZPULL are currently
* set to 256 and 780 respectively. The 256 is a number I pulled out of
* Thin Air. (So's the 780, for that matter...) Feel free to play with them
* to see what happens.
*
move.w d7,$258(a3) ; ZBuff store (for pixel brightness)
move.l d2,d0 ; 256 (pre-formatted)
move.w d3,d1 ; 780
sub.w d7,d1 ; - Z
ble.s BehindCamera
divs d1,d0 ; == 256 / -(Z - 780)
bvs.s BehindCamera ; Shunt wild division
move.w d6,d1 ; Y
muls d0,d1 ; * 256 / -(Z - 780)
lsr.l #8,d1
add.w #115,d1 ; + center_screen_y
move.w d1,$12C(a3) ; YBuff store
move.w d5,d1 ; X
muls d0,d1 ; * 256 / -(Z - 780)
lsr.l #8,d1
add.w #176,d1 ; + center_screen_x
move.w d1,(a3)+ ; XBuff store
dbra d4,NextStar
rts
;------ Whoops! Behind the camera. Force an invisible point.
BehindCamera moveq #-1,d1
move.w d1,$12C(a3) ; YBuff store
move.w d1,(a3)+ ; XBuff store
dbra d4,NextStar
rts
****************************************************************************
* Sine/Cosine calculator. Nothing amazing here, just a table lookup.
* D0: Angle (360 deg. == 1600)
* D0 is used directly as offset into sine table; MUST be even, lest Bad
* Things happen.
*
* Returns sine in D0, cosine in D1.
*
SinCos lea SineTable(pc),a5
move.w d0,d2
move.w 0(a5,d0.w),d0 ; Fetch sine
cmp.w #2048-512,d2
ble.s 1$
sub.w #2048-512,d2
bra.s 2$
1$ add.w #512,d2
2$ move.w 0(a5,d2.w),d1 ; Fetch cosine
rts
****************************************************************************
* Add spins to current rotation angles. Clip to 360° circle.
*
AddSpins move.w #2048-1,d1 ; 360° == 2048 EHG
lea theta_x(pc),a0
lea spin_x(pc),a1
move.w (a0),d0 ; Get angle
add.w (a1)+,d0 ; Add spin
and.w d1,d0 ; Clip to 360°
move.w d0,(a0)+ ; Store it back
move.w (a0),d0
add.w (a1)+,d0
and.w d1,d0
move.w d0,(a0)+
move.w (a0),d0
add.w (a1),d0
and.w d1,d0
move.w d0,(a0)
rts
****************************************************************************
* New ParseArgs. More flexible! Less filling!
* Added 9202.20 Finished 9205.09
*
* A0: Argument string.
*
* As the options are parsed, the destination address of the value is
* pushed on a queue. As values are acquired, the address is pulled,
* and the value stored there. Imbalances are checked and reported.
*
* SYNOPSIS
* [MRS][XYZ] <value> [ <value> ... ]
*
* Only one M, R, or S qualifier may accompany XYZ specifiers. They
* may be specified in any order, and the values need not immediately
* follow them.
*
* OPTIONS
* M: Move; specify translation
* R: Rotate; specify initial rotation
* S: Spin; specify spin velocities
*
ParseArgs movem.l d2/d7/a2-a5,-(sp)
sub.l a3,a3 ; Mode (NULL)
move.l sp,a4 ; Stacksave
move.l sp,a5 ; Pop pointer
;------ Copy active variables to workspace.
lea delta_x(pc),a1
lea wrk_delta(pc),a2
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.w (a1),(a2)
;------ Main parsing loop.
getchar moveq #0,d0
move.b (a0)+,d0 ; getchar()
beq EndOfString
cmp.b #'a',d0 ; Lower case?
blo.s 0$
sub.b #'a'-'A',d0 ; Convert to upper case
0$
;------ Test for whitespace.
cmp.b #' ',d0
beq.s whitespace
cmp.b #9,d0 ; TAB
beq.s whitespace
cmp.b #10,d0 ; Newline
beq.s whitespace
;------ Test for numeric.
cmp.b #'-',d0 ; Leading minus
beq.s numeric
cmp.b #'0',d0
blo.s 3$
cmp.b #'9',d0
bls.s numeric
3$
;------ Test for [B]ackground command.
cmp.b #'B',d0
bne.s 1$
move.w d0,BackServ ; All it has to be is non-zero
bra UnWindOK ; Ignore rest of string
1$
;------ Test for [Q]uit command.
cmp.b #'Q',d0
bne.s 2$
moveq #-1,d0 ; Tell upstairs we need to quit
bra UnWind ; Ignore rest of string
2$
;------ Test for '?' help.
moveq #ERR_HELP,d7
cmp.b #'?',d0
beq ParseError
;------ Test for 'XYZ'.
cmp.b #'X',d0
blo.s 4$
cmp.b #'Z',d0
bls.s GotXYZ
4$
;------ Test for 'MRS'; set mode if present.
cmp.b #'M',d0
bne.s 11$
lea wrk_delta(pc),a3 ; Set mode
bra.s getchar
11$
cmp.b #'R',d0
bne.s 22$
lea wrk_theta(pc),a3 ; Set mode
bra.s getchar
22$
cmp.b #'S',d0
bne 33$
lea wrk_spin(pc),a3 ; Set mode
bra getchar
33$
;------ Dunno what this is; error.
moveq #ERR_SYNTAX,d7
bra ParseError
;------ Process whitespace.
whitespace sub.l a3,a3 ; NULL out mode
bra getchar
;------ Process numerics.
numeric subq.w #1,a0 ; ungetchar()
bsr.s GatherNum ; Parsed value returned in D0
moveq #ERR_EXTRAVAL,d7
cmpa.l sp,a5 ; Are there values yet to be poked?
beq ParseError ; Nope, too many values.
move.l -(a5),a1 ; Get address to poke
move.w d0,(a1) ; Write value.
bra getchar
;------ Process presence of 'XYZ'.
GotXYZ moveq #ERR_NOMODE,d7
move.l a3,d1 ; Mode set?
beq ParseError ; No, user forgot MRS qualifier
sub.b #'X',d0 ; Compute index
add.w d0,d0 ; Compute word offset
add.l a3,d0 ; Add "mode" to get final address
move.l d0,-(sp) ; Push address
bra getchar
;------ End of string; perform sanity checks and return.
EndOfString moveq #ERR_MISSINGVAL,d7
cmpa.l sp,a5 ; Is stack empty?
bne.s ParseError
;------ Force angles and rotations to even values.
moveq #-2,d0 ; 0xFFFE
bclr #16,d0 ; Low bit in both word halves clear
lea wrk_theta(pc),a0
and.l d0,(a0)+ ; Zot, zot, zot...
and.l d0,(a0)+
and.l d0,(a0)+
;------ Copy new values to active variables.
lea wrk_delta(pc),a0
lea delta_x(pc),a1
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (a0),(a1)
UnWindOK moveq #0,d0 ; No error
UnWind move.l a4,sp ; Restore stack pointer
movem.l (sp)+,d2/d7/a2-a5
rts ; Back to you, Brian...
****************
* Gather decimal number.
*
GatherNum moveq #0,d0
moveq #0,d1
moveq #0,d2 ; negative flag
;------ Gather chars. Test for whitespace first.
numloop move.b (a0)+,d1
beq.s 11$ ; NULL; EOL
cmp.b #' ',d1
beq.s 11$
cmp.b #9,d1 ; TAB
beq.s 11$
cmp.b #10,d1 ; Newline
beq.s 11$
;------ Check for unary minus.
cmp.b #'-',d1
beq.s 22$
;------ Check for numeric.
moveq #ERR_BADVAL,d7
cmp.b #'0',d1
blo.s ParseError
cmp.b #'9',d1
bhi.s ParseError
;------ Accumulate numeric digit. Overflow not tested.
mulu #10,d0
sub.b #'0',d1
add.w d1,d0
bra.s numloop
;------ Flip sense of minus sign. We don't check for multiple
;------ instances.
22$ not.b d2
bra.s numloop
;------ Whitespace encountered; return to parser for storage.
11$ tst.b d2 ; This number negative?
beq.s 110$
neg.w d0 ; Yep, turn it over.
110$
rts
****************
* Short routine to report parsing errors
*
ParseError move.l ErrStrs(pc,d7.w),d0 ; Pointer to error string.
bra.s UnWind
ErrStrs dc.l SyntaxErr,BadVal,ModeMissing,MissingVal
dc.l ExtraVal,HelpStr
ERR_SYNTAX EQU 0
ERR_BADVAL EQU 4
ERR_NOMODE EQU 8
ERR_MISSINGVAL EQU 12
ERR_EXTRAVAL EQU 16
ERR_HELP EQU 20
****************************************************************************
* Print string to CLI. Pointer to string in D0.
*
PrintCLIStr movem.l d2/d3/a2/a6,-(sp)
move.l d0,a2 ; Save string pointer.
move.l DOSBase(pc),a6
jsrlib Output ; Somewhere to print?
move.l d0,d1
beq.s 99$ ; No, forget it
move.l a2,d2 ; Compute string length
0$ tst.b (a2)+
bne.s 0$
suba.l d2,a2
move.l a2,d3
subq.l #1,d3
jsrlib Write ; Write string
99$
movem.l (sp)+,d2/d3/a2/a6
rts
****************************************************************************
* Bottom-of-frame interrupt routine.
*
BOFintr moveq #0,d0
bset.l #SIGBREAKB_CTRL_F,d0 ; F stands for Frame
move.l (4).w,a6
jsrlib Signal ; Task ptr already in A1
moveq #0,d0
rts
****************************************************************************
* Something I added to make things more reliable.
*
ClearBSS move.l #EndBSS,d2
lea StartBSS,a2
sub.l a2,d2
subq.w #1,d2
1$ clr.b (a2)+
dbra d2,1$
rts
****************************************************************************
* Data! (Yes, Captain?)
*
NumStars dc.w 68
delta_x dc.w 0 ; Star movement
delta_y dc.w 0
delta_z dc.w 4
theta_x dc.w 0 ; Initial/current rotation angles
theta_y dc.w 0
theta_z dc.w 0
spin_x dc.w 0 ; Spin velocities
spin_y dc.w 0
spin_z dc.w 0
wrk_delta dc.w 0,0,0 ; Working areas for the parser
wrk_theta dc.w 0,0,0
wrk_spin dc.w 0,0,0
CurrentSinCos dc.w 0 ; theta_x
dc.w 0
dc.w 0 ; theta_y
dc.w 0
dc.w 0 ; theta_z
dc.w 0
IBase dc.l 0
GBase dc.l 0
DOSBase dc.l 0
winptr dc.l 0
Plane1ptr dc.l 0
Plane2ptr dc.l 0
sprdat dc.l 0
WBStartMsg dc.l 0
StarMsg dc.l 0
StarSigMask dc.l 0
StarSigs dc.l 0
BackServ dc.w 0
XCoords dc.w $FF37,$FED2,$6A,$FFF7,$C8,$CD,$FFF9,$132,$FF35
dc.w $FF9A,$FF7F,$16B,$EC,$FFF7,$186,$FF5A,$FF0D,$177
dc.w $FEAF,$6F,$FF5F,$FF22,$150,$2B,$FED5,$FEE3,$90,$AA
dc.w $FEBE,$13A,$12D,$FFA4,$FF49,$FEEE,$41,$164,$FF09
dc.w $8A,$FFE3,$D2,$FEBE,$13A,$12D,$FFA4,$FF49,$FEEE,$41
dc.w $164,$FF09,$8A,$FF46,$FF85,$154,$FF19,$60,$FF5C,$9B
dc.w $FFA8,$FF18,$158,$AE,$FF2F,$FE72,$21,$8C,$FE8B,$CF
dc.w $48,$FF7A,$137,$C8,$FED4
YCoords dc.w $FF5F,$FF22,$150,$2B,$FED5,$FEE3,$90,$AA,$FEBE,$13A
dc.w $12D,$FFA4,$FF49,$FEEE,$41,$164,$FF09,$8A,$FFE3,$D2
dc.w $FF37,$FED2,$6A,$FFF7,$C8,$CD,$FFF9,$132,$FF35
dc.w $FF9A,$FF7F,$16B,$EC,$FFF7,$186,$FF5A,$FF0D,$177
dc.w $FEAF,$6F,$177,$FEAF,$6F,$FF5F,$FF22,$150,$2B,$FED5
dc.w $FEE3,$90,$164,$FF09,$8A,$FFE3,$FF52,$FF2F,$18E,$21
dc.w $FF74,$FE8B,$CF,$FFB8,$86,$FEC9,$D2,$FF22,$94,$14D
dc.w $FE9B,$F4,$C8,$12C
ZCoords dc.w $FF52,$FF2F,$FE72,$21,$8C,$175,$FF31,$FFB8,$FF7A
dc.w $137,11,$153,$FF22,$94,$14D,$FE9B,$F4,$FEEC,$9B
dc.w $FF46,$FF85,$154,$FF19,$60,$FF5C,$9B,$FFA8,$FF18
dc.w $158,$FF61,$FE8F,$F8,$FEE7,$8C,$FF85,$48,$FEAC
dc.w $FF17,$6A,$13B,$FF01,$FF3A,$FFF9,7,$BE,$12B,$FED1
dc.w $FE94,$FC,$FF91,$CD,$FFF9,$132,$FF35,$FF9A,$FF7F
dc.w $16B,$EC,$FFF7,$186,$FED2,$6A,$FFF7,$C8,$CD,$FFF9
dc.w $132,$FF35,$FF9A,$FF7F,$96,$FF06
SineTable dc.w 0,2,3,5,6,8,9,11
dc.w 13,14,16,17,19,20,22,24
dc.w 25,27,28,30,31,33,34,36
dc.w 38,39,41,42,44,45,47,48
dc.w 50,51,53,55,56,58,59,61
dc.w 62,64,65,67,68,70,71,73
dc.w 74,76,77,79,80,82,83,85
dc.w 86,88,89,91,92,94,95,97
dc.w 98,99,101,102,104,105,107,108
dc.w 109,111,112,114,115,117,118,119
dc.w 121,122,123,125,126,128,129,130
dc.w 132,133,134,136,137,138,140,141
dc.w 142,144,145,146,147,149,150,151
dc.w 152,154,155,156,157,159,160,161
dc.w 162,164,165,166,167,168,170,171
dc.w 172,173,174,175,177,178,179,180
dc.w 181,182,183,184,185,186,188,189
dc.w 190,191,192,193,194,195,196,197
dc.w 198,199,200,201,202,203,204,205
dc.w 206,207,207,208,209,210,211,212
dc.w 213,214,215,215,216,217,218,219
dc.w 220,220,221,222,223,224,224,225
dc.w 226,227,227,228,229,229,230,231
dc.w 231,232,233,233,234,235,235,236
dc.w 237,237,238,238,239,239,240,241
dc.w 241,242,242,243,243,244,244,245
dc.w 245,245,246,246,247,247,248,248
dc.w 248,249,249,249,250,250,250,251
dc.w 251,251,252,252,252,252,253,253
dc.w 253,253,254,254,254,254,254,255
dc.w 255,255,255,255,255,255,256,256
dc.w 256,256,256,256,256,256,256,256
dc.w 256,256,256,256,256,256,256,256
dc.w 256,256,256,255,255,255,255,255
dc.w 255,255,254,254,254,254,254,253
dc.w 253,253,253,252,252,252,252,251
dc.w 251,251,250,250,250,249,249,249
dc.w 248,248,248,247,247,246,246,245
dc.w 245,245,244,244,243,243,242,242
dc.w 241,241,240,239,239,238,238,237
dc.w 237,236,235,235,234,233,233,232
dc.w 231,231,230,229,229,228,227,227
dc.w 226,225,224,224,223,222,221,220
dc.w 220,219,218,217,216,215,215,214
dc.w 213,212,211,210,209,208,207,207
dc.w 206,205,204,203,202,201,200,199
dc.w 198,197,196,195,194,193,192,191
dc.w 190,189,188,186,185,184,183,182
dc.w 181,180,179,178,177,175,174,173
dc.w 172,171,170,168,167,166,165,164
dc.w 162,161,160,159,157,156,155,154
dc.w 152,151,150,149,147,146,145,144
dc.w 142,141,140,138,137,136,134,133
dc.w 132,130,129,128,126,125,123,122
dc.w 121,119,118,117,115,114,112,111
dc.w 109,108,107,105,104,102,101,99
dc.w 98,97,95,94,92,91,89,88
dc.w 86,85,83,82,80,79,77,76
dc.w 74,73,71,70,68,67,65,64
dc.w 62,61,59,58,56,55,53,51
dc.w 50,48,47,45,44,42,41,39
dc.w 38,36,34,33,31,30,28,27
dc.w 25,24,22,20,19,17,16,14
dc.w 13,11,9,8,6,5,3,2
dc.w 0,-2,-3,-5,-6,-8,-9,-11
dc.w -13,-14,-16,-17,-19,-20,-22,-24
dc.w -25,-27,-28,-30,-31,-33,-34,-36
dc.w -38,-39,-41,-42,-44,-45,-47,-48
dc.w -50,-51,-53,-55,-56,-58,-59,-61
dc.w -62,-64,-65,-67,-68,-70,-71,-73
dc.w -74,-76,-77,-79,-80,-82,-83,-85
dc.w -86,-88,-89,-91,-92,-94,-95,-97
dc.w -98,-99,-101,-102,-104,-105,-107,-108
dc.w -109,-111,-112,-114,-115,-117,-118,-119
dc.w -121,-122,-123,-125,-126,-128,-129,-130
dc.w -132,-133,-134,-136,-137,-138,-140,-141
dc.w -142,-144,-145,-146,-147,-149,-150,-151
dc.w -152,-154,-155,-156,-157,-159,-160,-161
dc.w -162,-164,-165,-166,-167,-168,-170,-171
dc.w -172,-173,-174,-175,-177,-178,-179,-180
dc.w -181,-182,-183,-184,-185,-186,-188,-189
dc.w -190,-191,-192,-193,-194,-195,-196,-197
dc.w -198,-199,-200,-201,-202,-203,-204,-205
dc.w -206,-207,-207,-208,-209,-210,-211,-212
dc.w -213,-214,-215,-215,-216,-217,-218,-219
dc.w -220,-220,-221,-222,-223,-224,-224,-225
dc.w -226,-227,-227,-228,-229,-229,-230,-231
dc.w -231,-232,-233,-233,-234,-235,-235,-236
dc.w -237,-237,-238,-238,-239,-239,-240,-241
dc.w -241,-242,-242,-243,-243,-244,-244,-245
dc.w -245,-245,-246,-246,-247,-247,-248,-248
dc.w -248,-249,-249,-249,-250,-250,-250,-251
dc.w -251,-251,-252,-252,-252,-252,-253,-253
dc.w -253,-253,-254,-254,-254,-254,-254,-255
dc.w -255,-255,-255,-255,-255,-255,-256,-256
dc.w -256,-256,-256,-256,-256,-256,-256,-256
dc.w -256,-256,-256,-256,-256,-256,-256,-256
dc.w -256,-256,-256,-255,-255,-255,-255,-255
dc.w -255,-255,-254,-254,-254,-254,-254,-253
dc.w -253,-253,-253,-252,-252,-252,-252,-251
dc.w -251,-251,-250,-250,-250,-249,-249,-249
dc.w -248,-248,-248,-247,-247,-246,-246,-245
dc.w -245,-245,-244,-244,-243,-243,-242,-242
dc.w -241,-241,-240,-239,-239,-238,-238,-237
dc.w -237,-236,-235,-235,-234,-233,-233,-232
dc.w -231,-231,-230,-229,-229,-228,-227,-227
dc.w -226,-225,-224,-224,-223,-222,-221,-220
dc.w -220,-219,-218,-217,-216,-215,-215,-214
dc.w -213,-212,-211,-210,-209,-208,-207,-207
dc.w -206,-205,-204,-203,-202,-201,-200,-199
dc.w -198,-197,-196,-195,-194,-193,-192,-191
dc.w -190,-189,-188,-186,-185,-184,-183,-182
dc.w -181,-180,-179,-178,-177,-175,-174,-173
dc.w -172,-171,-170,-168,-167,-166,-165,-164
dc.w -162,-161,-160,-159,-157,-156,-155,-154
dc.w -152,-151,-150,-149,-147,-146,-145,-144
dc.w -142,-141,-140,-138,-137,-136,-134,-133
dc.w -132,-130,-129,-128,-126,-125,-123,-122
dc.w -121,-119,-118,-117,-115,-114,-112,-111
dc.w -109,-108,-107,-105,-104,-102,-101,-99
dc.w -98,-97,-95,-94,-92,-91,-89,-88
dc.w -86,-85,-83,-82,-80,-79,-77,-76
dc.w -74,-73,-71,-70,-68,-67,-65,-64
dc.w -62,-61,-59,-58,-56,-55,-53,-51
dc.w -50,-48,-47,-45,-44,-42,-41,-39
dc.w -38,-36,-34,-33,-31,-30,-28,-27
dc.w -25,-24,-22,-20,-19,-17,-16,-14
dc.w -13,-11,-9,-8,-6,-5,-3,-2
colors dc.w 0,$336,$669,$CCF
GfxName dc.b 'graphics.library',0
IntuiName dc.b 'intuition.library',0
DOSName dc.b 'dos.library',0
ESName dc.b 'EuroStars',0
ESPortName dc.b 'EUROSTARS',0 ; ARexx wants uppercase. Sigh...
****************
* Error strings
*
SyntaxErr dc.b "Syntax error.",10,0
BadVal dc.b "Bad value.",10,0
ModeMissing dc.b "Must specify M, R, or S before XYZ.",10,0
MissingVal dc.b "Expecting more values.",10,0
ExtraVal dc.b "Unexpected extra value.",10,0
dc.b "$VER: "
HelpStr dc.b "ES 1.0 (12.5.92) -- EuroStars",10
dc.b "Written by Leo L. Schwab.",10,10
dc.b "Usage:",10
dc.b 9,"ES [MRS][XYZ] <value> [<value> ... ]",10
dc.b 9,"ES B",9,"; Run as background server",10
dc.b 9,"ES Q",9,"; Quit (ARexx only)",10,10
dc.b "ARexx port name is EUROSTARS.",10,0
****************
* Static structure definitions.
*
cnop 0,4
;------ NewScreen
scr_def dc.w 0,0
dc.w 352,230
dc.w 2
dc.b 0,1
dc.w 0
dc.w CUSTOMSCREEN!SCREENQUIET
dc.l 0
dc.l ESName
dc.l 0
dc.l 0
;------ NewWindow
windef dc.w 0,0
dc.w 352,230
dc.b -1,-1
dc.l MOUSEBUTTONS
dc.l SMART_REFRESH!BACKDROP!BORDERLESS!ACTIVATE
dc.l 0
dc.l 0
dc.l 0
scrptr dc.l 0
dc.l 0
dc.w 0,0,0,0
dc.w CUSTOMSCREEN
;------ MessagePort
mport dc.l 0,0 ; LN_SUCC, LN_PRED
dc.b NT_MSGPORT ; LN_TYPE
dc.b 0 ; LN_PRI
dc.l ESPortName ; LN_NAME
dc.b PA_SIGNAL ; MP_FLAGS
mpsigbit dc.b -1 ; MP_SIGBIT
mpsigtask dc.l 0 ; MP_SIGTASK
ds.b LH_SIZE ; MP_MSGLIST,LH_SIZE
;------ Startup Message
startmsg dc.l 0,0 ; LN_SUCC, LN_PRED
dc.b NT_MESSAGE ; LN_TYPE
dc.b 0 ; LN_PRI
dc.l ESName ; LN_NAME
dc.l mport ; MN_REPLYPORT
dc.w MN_SIZE ; MN_LENGTH
;------ Interrupt structure
BOFintrnode dc.l 0,0 ; LN_SUCC, LN_PRED
dc.b NT_INTERRUPT ; LN_TYPE
dc.b 0 ; LN_PRI
dc.l ESName ; LN_NAME
StarTask dc.l 0 ; IS_DATA
dc.l BOFintr ; IS_CODE
****************************************************************************
* Uninitialized data
*
SECTION EuroStars,BSS
StartBSS:
MyCopList ds.b ucl_SIZEOF
XBuff ds.w 150
YBuff ds.w 150
ZBuff ds.w 150
PlaneOffsets ds.w 150
EndBSS:
END